//
//  UserAccountViewModel.swift
//  Weibo
//
//  Created by apple on 15/12/10.
//  Copyright © 2015年 idcast. All rights reserved.
//

import Foundation
//用户账号试图模型
/**
   模型通常继承自NSObject 可以使用KVC设置赋值  简化对象构造
    如果没有父类 所有的内容 都需要从头创建 量级更轻
    试图模型的作用 ： 封装业务逻辑 通常没有复杂的属性

*/

class UserAccountViewModel {
    //单例 解决避免重复从沙河加载 归档文件 提高效率 让access_token 便于被访问到
    static let sharedUserAccount = UserAccountViewModel()
    
    //用户模型
    var account: UserAccount?
    // MARK: - 计算型属性封装的小的`业务逻辑`
    /// 返回有效的 token
    var accessToken: String? {
        
        // 如果 token 没有过期，返回 account.中的 token 属性
        if !isExpired {
            return account?.access_token
        }
        return nil
    }

    
    //定义个用户登陆标记
    var userLogon: Bool {
    
        return account?.access_token != nil && !isExpired
    }
    //用户头像
    var avatarUrl: NSURL {
    
        return NSURL(string: account?.avatar_large ?? "")!
    }
    
    //归档保存的路径 计算型属性  (类似于有返回值的函数 可以让调用的时候 语义更清新)
    private var accountPath: String {
    
        //1 给个保存路径
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        //2  从Xcode7  bate5开始stringByAppendingPathComponent 转为NSSTing 特有
        //单纯的  as  在Swift中只有三个地方会被桥接
        //string as nsstring
        //nasrray as [array]
        //nsdictionary as [nstring: anyobject]
        
       return (path as NSString).stringByAppendingPathComponent("account.plist")
        
    }
    ///判断是否过期
    private var isExpired: Bool {
    
    
        if account?.expiresDate?.compare(NSDate()) ==
            NSComparisonResult.OrderedDescending {
            return false
        }
        return true
    }
    
    
    //构造函数
    init() {
    
        //从沙河解档数据 恢复当前数据
        account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount
        
        //判断token是否过期
        if isExpired {
        
            //已经过期
            account = nil
        }
        
        print(account)
    }
    
}
///MARK 用户账户相关的网络方法
extension UserAccountViewModel {

    func loadAccessToken(code: String, finished: (isSuccessed: Bool) -> ()) {
    
        
        NetwokeTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            // 1> 判断错误
            if error != nil {
                print("加载用户出错了")
                //失败的回调
                
                finished(isSuccessed: false)
                return
            }
            // 2> 输出结果 － 在 Swift 中任何 AnyObject 在使用前，必须转换类型 -> as ?/! 类型
           
            
            self.account = UserAccount(dict: result as! [String: AnyObject])
            
            self.loadUserInfo(self.account!, finished: finished)
            
            
        }
    }
    /// 加载用户信息
    ///
    /// - parameter account: 用户账户对象
    private func loadUserInfo(account: UserAccount, finished: (isSuccessed: Bool)->()) {
        
        NetwokeTools.sharedTools.loadUserInfo(account.uid!) { (result, error) -> () in
            
            if error != nil {
                
                print("加载用户出错了1111")
                
                finished(isSuccessed: false)
                return
            }
            
            // 提示：如果使用 if let / guard let 统统使用 `?`
            // 作了两个判断
            // 1. result 一定有内容
            // 2. 一定是字典
            guard let dict = result as? [String: AnyObject] else {
                print("格式错误")
                
                finished(isSuccessed: false)
                return
            }
            
            // dict 一定是一个有值的字典
            // 将用户信息保存
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            
            // 保存对象 － 会调用对象的 encodeWithCoder 方法
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            
            print(self.accountPath)
            
            // 需要完成回调!!!
            finished(isSuccessed: true)
        }
    }

        
        
}
    